package com.tim.third;

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.text.PDFTextStripper;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/**
 * pdfbox
 * https://pdfbox.apache.org/
 * https://blog.csdn.net/qq_39826207/article/details/131668631
 */
@Slf4j
public class PdfboxUtils {

    public static void main(String[] args) throws IOException {
        String path = "F:\\个人\\王娜\\娜娜资料\\重啤股份2022年报.pdf";
        String content = read(path);
        log.info("pdf内容：\n{}", content);
    }

    /**
     * 读取pdf内容
     */
    public static String read(String fileName) throws IOException {
        File file = new File(fileName);
        PDDocument doc = null;
        try {
            RandomAccessFile is = new RandomAccessFile(file, "r");
            PDFParser parser = new PDFParser(is);
            parser.parse();
            doc = parser.getPDDocument();
            PDFTextStripper textStripper = new PDFTextStripper();
            textStripper .setSortByPosition(true); //sort设置为true 则按照行进行读取，默认是false
            String content = textStripper.getText(doc);
//            System.out.println(content);
            return content;
        }finally {
            if(doc!=null){
                doc.close();
            }
        }

    }

    /**创建PDF文档*/
    public static void createPdf(String fileName) throws IOException {
        // 1、创建文档对象
        PDDocument doc = new PDDocument();
        // 2、生成pdf文件，保存pdf文件
        // 这里会在D盘下生成一个 demo.pdf 空白的pdf文档
        doc.save("D:\\demo.pdf");
        // 3、关闭文档流
        doc.close();
    }


    /**加载本地PDF文档*/
    public static void loadFile(String path) throws IOException {
// 1、加载文档对象
        File file = new File(path);
        PDDocument doc = PDDocument.load(file);
// TODO 做一些操作
// ....

// 关闭文档
        doc.close();
    }


    /**加载网络PDF文档*/
    public static void loadUrl(String url) throws IOException {
        // 1、加载网络PDF文档
        PDDocument doc = PDDocument.load(new URL("https://ip:port/demo.pdf").openStream());
        // .....
        // 关闭文档
        doc.close();
    }

    /**添加空白页面*/
    public static void addPage(String path) throws IOException {
        // 1、创建文档对象
        PDDocument doc = new PDDocument();
        // 2、添加空白页面，大小是 A4 纸那么大
        PDPage page = new PDPage(PDRectangle.A4);
        doc.addPage(page);
        // 3、生成pdf文件，保存pdf文件
        // 这里会在D盘下生成一个 demo.pdf 空白的pdf文档
        doc.save(path);
        // 4、关闭文档流
        doc.close();
    }

    /**删除某个页面*/
    public static void delPage(String path) throws IOException {
// 1、创建文档对象
        PDDocument doc = new PDDocument();

// TODO 删除第1个页面
        doc.removePage(0);

// 或者删除指定的Page对象页面
// PDPage page = new PDPage(PDRectangle.A4);
// doc.removePage(page);

    }


    /**获取PDF总页数*/

    public static int getPages(String path) throws IOException {
// 1、创建文档对象
        PDDocument doc = new PDDocument();

// TODO 获取文档总页数
        int pages = doc.getNumberOfPages();
        System.out.println("总页数: " + pages);
        return pages;
    }


    /**添加文本内容*/

    public static void addLine(String line) throws IOException {
// 1、创建文档对象
        PDDocument doc = new PDDocument();
        // 2、添加空白页面，大小是 A4 纸那么大
        PDPage page = new PDPage(PDRectangle.A4);
        doc.addPage(page);

        // TODO 添加文本内容【单行】，指定文档对象、页面对象
        PDPageContentStream stream = new PDPageContentStream(doc, page);
        stream.beginText(); // 文本开始
        stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 设置文本的字体、字体大小
        stream.newLineAtOffset(10, 200); // 设置文本显示的起始坐标位置
        String content = "hello world.hello world.hello world.hello world.hello world." +
                "hello world.hello world.hello world.hello world.";
        stream.showText(content); // 设置需要添加的文本内容，注意：中文内容写入时候，需要保证字体支持中文
        stream.endText(); // 文本结束
        stream.close(); // 关闭内容流

        // 3、生成pdf文件，保存pdf文件
        // 这里会在D盘下生成一个 demo.pdf 空白的pdf文档
        doc.save("D:\\demo.pdf");
        // 4、关闭文档流
        doc.close();

    }


    /**写入多行内容*/

    public static void addMultiLines(String[] args) throws IOException {

// 1、创建文档对象
        PDDocument doc = new PDDocument();
        // 2、添加空白页面，大小是 A4 纸那么大
        PDPage page = new PDPage(PDRectangle.A4);
        doc.addPage(page);

        // TODO 添加文本内容，指定文档对象、页面对象
        PDPageContentStream stream = new PDPageContentStream(doc, page);
        stream.beginText(); // 文本开始
        stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 设置内容流文本的字体、字体大小
        stream.newLineAtOffset(10, 350); // 设置内容流文本显示的起始坐标位置
        for (int i = 0; i < 10; i++) {
            stream.setLeading(20 + i*2); // 设置文本的前导，也就是文本行距，不设置这个行距，文本会重叠在一起
            String content = "hello world.hello world.hello world.hello world.hello world." +
                    "hello world.hello world.hello world.hello world.";
            stream.showText(content); // 设置需要添加的文本内容，注意：中文内容写入时候，需要保证字体支持中文
            stream.newLine(); // 新增一个新行显示
        }
        stream.endText(); // 文本结束
        stream.close(); // 关闭内容流

        // 3、生成pdf文件，保存pdf文件
        // 这里会在D盘下生成一个 demo.pdf 空白的pdf文档
        doc.save("D:\\demo.pdf");
        // 4、关闭文档流
        doc.close();
    }







}
